//
//  HMNetworkTools.swift
//  75 - Swift中网络的封装
//
//  Created by 饶鹏伟 on 16/4/9.
//  Copyright © 2016年 饶鹏伟. All rights reserved.
//

import UIKit
import AFNetworking

//swift 中的枚举
enum HMHttpMethods: String {
    case POST = "POST"
    case GET = "GET"
}

//使用结构体来定义 接口的名称
struct API{
    
    //线上环境接口
    static let onlineHost="https://api.weibo.com/"
    //测试环境接口 这里随便定义的  在上传AppStore之前 一定要取消使用这个环境
    static let devHost="https://dev.api.weibo.com/"
    //请求access_token的接口
    static let authrizon = "oauth2/access_token"
    //请求用户数据的接口
    static let access_token = "2/users/show.json"
    //请求首页数据的接口
    static let homepage = "2/statuses/home_timeline.json"
    //发布一条微博接口
    static let sendStatus = "2/statuses/update.json"
    //发布一条微博 并上传图片接口
    static let uploadImage = "https://upload.api.weibo.com/2/statuses/upload.json"
    
    
}


class HMNetworkTools: AFHTTPSessionManager {
    //声明一个单例对象
    static let shardTools: HMNetworkTools={
        
        let tools=HMNetworkTools(baseURL: NSURL(string: API.onlineHost))
        
        tools.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return tools
    }()
    
   
}


//登陆和注册相关 
extension HMNetworkTools{
    //加载token
    func loadAccessToken(code: String, finished: (result: AnyObject?, error: NSError?) ->()){
        
        //  拼接参数 AFN中参数 以字典的形式传递
        let parameters=["client_id":client_id, "client_secret":client_secret, "grant_type":"authorization_code", "code":code, "redirect_uri":redirect_uri]
        
        //发送请求
        request(.POST, urlString: API.authrizon, parameters:parameters , finished: finished)
    }
    
    //加载用户信息
    func loadUserInfo(token: AnyObject, uid: AnyObject,finished: (result: AnyObject?, error: NSError?) ->()){
        //拼接参数
        let parameters=["access_token": token, "uid": uid]

        //发送请求
        request(.GET, urlString: API.access_token, parameters: parameters, finished: finished)
    
    }
}


//首页相关
extension HMNetworkTools{
    
    func loadHomePageData(token: String,max_id: Int64,since_id: Int64,finished: (result: AnyObject?, error: NSError?) -> ()) {
        
        //拼接传入的参数 看看是max_id还是since_id
        var parameters = ["access_token": token]
        if max_id > 0 {
            //max_id - 1解决数据重复的问题
            parameters["max_id"] = "\(max_id-1)"
        }
        if since_id > 0 {
            parameters["since_id"] = "\(since_id)"
        }
        request(.GET, urlString: API.homepage, parameters: parameters, finished: finished)
    }
    
}


//发布微博和图片 扩展
extension HMNetworkTools{
    
     //要发布的微博文本内容，必须做URLencode
    //发送图片微博：请求必须用POST方式提交，并且注意采用multipart/form-data编码方式；

    //定义一个方法 供外界调用
    func sendStatus(token: String, status: String, imageList: [UIImage] = [UIImage](),finished: (result: AnyObject?, error: NSError?) -> ()){
        
        //拼接请求参数
        let parameters = ["access_token": token, "status": status]
        
        if imageList.count>0{
            //如果有图片 说明发布的是图片微博
            
            //AFN上传图片
            POST(API.uploadImage, parameters: parameters, constructingBodyWithBlock: { (formdata) -> Void in
                
                
                //
                /**
                *将要上传的二进制数据添加到formdata
                *
                *  @param data  要上传的二进制数据
                *  @param name  服务器接收上传文件的字段名
                *  @param fileName  服务器获取到文件之后 以什么名称存储  名字可以随便取,新浪微博会按照自己的命名规则命名
                *  @param mimeType   文件类型
                *
                *  @return
                */
                // 第一个 '!' 表示一定获取一张图片  第二个 '!' 一定要将获取的图片转换 二进制
                

                
                //遍历图片数组
                for (index,image) in imageList.enumerate(){
                    
                    //把图片转为二进制
                    let imageData=UIImagePNGRepresentation(image)!
                    
                    //添加到formdata
                    formdata.appendPartWithFileData(imageData, name: "pic", fileName: "xxxxxx\(index)", mimeType: "image/jpeg")
                    
                }
            
                
                }, progress: nil, success: { (_, result) -> Void in
                    
                    //执行成功的回调
                    finished(result: result, error: nil)
                    
                }, failure: { (_, error) -> Void in
                    
                    //执行失败的回调
                    finished(result: nil, error: error)
                    
            })
        
        }else{
            
            //发布文本微博
            
            request(.POST, urlString: API.sendStatus, parameters: parameters, finished: finished)
        
        }
        
    }
    
   
}






//网络请求的核心方法 以后所以的get 和 post都走这个方法
    extension HMNetworkTools{
        
        
        //封装所有的网络请求方法 所有的网络请求都是通过这个方法和 AFN进行联系
        
        func request(method: HMHttpMethods, urlString: String, parameters: AnyObject?, finished: (result: AnyObject?, error: NSError?) ->()){
            
            //swift中就不能够使用利用协议 欺骗Xcode
            //为了达到封装的目的 可以将相同的闭包 抽取出来,当做参数传递给AFN框架
            //定义成功的回调
            let success = { (task: NSURLSessionDataTask, result: AnyObject?) -> Void in
                
                //执行成功的回调
                finished(result: result, error: nil)
                
            }
            //定义失败的回调
            let failure = { (task: NSURLSessionDataTask?, error: NSError) -> Void in
                
                //执行失败的回调
                finished(result: nil, error: error)
                
                print(error)
                
            }
            if method == .GET {
                
                GET(urlString, parameters: parameters, progress: nil, success: success, failure: failure)
                
            }else{
                
                POST(urlString, parameters: parameters, progress: nil, success: success, failure: failure)
                
            }
        }
        
    }
    
    

